В определении фабрики классов есть функция CreateInstance, с помощью этой функции производится создание нового COM сервера. Вот её определение.
HRESULT CreateInstance ( IUnknown * pUnkOuter, REFIID riid, void ** ppvObject );
Идея такая. Клиент получает указатель на фабрику классов и вызывает этот метод для получения нового класса. Это примерно тоже, что и new. Результат работы этой функции должен быть вот такой.
S_OK // нормально CLASS_E_NOAGGREGATION // не могла я сделать обьект E_NOINTERFACE // нет интерфейса
Давайте создадим класс, который наследует методы IUnknown при этом нам придется создать два класса.
класс IStep класс Step
В классе IStep будут объявлены все интерфейсы, а в классе Step они будут реализованы. Добавляйте класс IStep. В этом же файле лучше объявить и идентификаторы GUID для объектов, которые надо сгенерировать GUIDGEN.
// IStep.h: interface for the IStep class.
//
//////////////////////////////////////////////
..............
#include "ole2.h"
// {3F5942E1-108B-11d4-B050-000001260696}
DEFINE_GUID(CLSID_Step,
0x3f5942e1, 0x108b, 0x11d4, 0xb0, 0x50, 0x0, 0x0, 0x1, 0x26, 0x6, 0x96);
DEFINE_GUID(IID_Step,
0x3f5942e2, 0x108b, 0x11d4, 0xb0, 0x50, 0x0, 0x0, 0x1, 0x26, 0x6, 0x96);
class IStep : public IUnknown
{
public:
IStep();
virtual ~IStep();
STDMETHOD(MyComMessage) () PURE;
};
А вот теперь можно создать и сам класс Step с реализацией интерфейсов. Создавайте этот класс как порожденный от IStep. Вот его описание.
#include "IStep.h"
class Step : public IStep
{
public:
Step();
virtual ~Step();
// IUnknown
STDMETHOD(QueryInterface( REFIID, void** ));
STDMETHOD_(ULONG, AddRef());
STDMETHOD_(ULONG, Release());
// IStep
STDMETHOD(MyComMessage) ();
};
Ну и в класс фабрики классов нужно включить объявления на этот класс для дальнейшего использования его в CreateInstance.
#include "step.h"
extern long g_lLocks;
class CClassFactory : public IClassFactory
{
......
}
Не компилируйте пока приложение, так как получите сообщения о куче нереализованных методах. Мы просто пока подготовили классы.